{
TÍTULO: Práctica de EDI
SUBTÍTULO: Practica 1
AUTOR: Sergio Morlán Reborido 	LOGIN: infsmr03
GRUPO: E.I
FECHA: 08/05/09
}

program principal;

uses sysutils, {proporciona la funcion TRIM }
     ListaDinamica;

VAR
   ficheroOperaciones : TEXT;
   linea              : STRING;
   operacion          : STRING;
   numero             : STRING;
   operador           : STRING;
	L:tLista;

{Tarea:Muestra la lista}
PROCEDURE MostrarLista(L:tLista);
VAR 
	p:tPos;
	num:tNumeroTelefono;
	oper:tOperadorTelefono;
BEGIN
	WRITELN;
	p:=Primero(L);
	WHILE (Siguiente(L,p)<>NULO) DO BEGIN
		ObtenerDato(L,p,num,oper);
		WRITELN('Abonado numero ',num,' Operador ',oper);
		p:=Siguiente(L,p)
	END;
	ObtenerDato(L,p,num,oper);
	WRITELN('Abonado numero ',num,' Operador ',oper);
END;

{Tarea:Inserta en la lista un nuevo elemento
Entrada:La lista, el numero de telefono y el operador
Salida:La lista con el dato insertado o un error si no se puede}
PROCEDURE Alta(VAR L:tLista;num:tNumeroTelefono;oper:tOperadorTelefono);
BEGIN
	IF Buscar(L,num)=NULO THEN BEGIN
		InsertarOrdenado(L,num,oper);
		WRITELN('Alta de Abonado: numero ',num,' Operador ',oper);
		WRITELN;
		MostrarLista(L)
	END
	ELSE BEGIN
		WRITELN;
		WRITELN('    *******************************************************************');
		WRITELN('          Error en Alta: El número ',numero,' ya dispone de servicio');
		WRITELN('    *******************************************************************');
	END;
END;

{Tarea:Da de baja todos los elementos del operador especificado
Entrada:La lista y el operador a borrar
Salida:La lista con todos los usuarios de ese operador borrados o un error si no se puede}
PROCEDURE BajaCompania(VAR L:tLista;oper:tOperadorTelefono);
VAR 
	p:tPos;
	num:tNumeroTelefono;
	sw:boolean;
BEGIN
	sw:=TRUE;
	p:=Primero(L);
	WHILE (p<>NULO) DO BEGIN
		ObtenerDato(L,p,num,oper);
		IF oper=operador THEN BEGIN
			IF sw THEN BEGIN
				WRITELN('Bajas de abonados del Operador ',oper);
				sw:=FALSE;
			END;
			WRITELN('Abonado: Numero ',num);
			Borrar(L,p);
		END;
		p:=Siguiente(L,p);
	END;
	IF sw THEN BEGIN
		WRITELN;
		WRITELN('    *******************************************************************');
		WRITELN('          Error en Baja: No hay telefonos del Operador ',operador);
		WRITELN('    *******************************************************************');
	END
END;

{Tarea:Da de baja un ususario de la lista
Entrada: La lista y el numero de telefono a dar de baja
Salida:La lista con el dato borrado o un error si no se puede
}
PROCEDURE BajaUsuario(VAR L:tLista;num:tNumeroTelefono);
VAR 
	p:tPos;
	oper:tOperadorTelefono;
BEGIN
	p:=Buscar(L,num);
	IF p<>NULO THEN BEGIN
		ObtenerDato(L,p,num,oper);
		WRITELN('Baja de abonado: Numero ',num,' Operador ',oper);
		Borrar(L,p)
	END
	ELSE BEGIN
		WRITELN;
		WRITELN('    *******************************************************************');
		WRITELN('          Error en Baja: No existe el número ',numero);
		WRITELN('    *******************************************************************')
	END	
END;

{Tarea:Comprueba si es una baja de usuario o una baja de compañia y llama al procedimiento correspondiente
Entrada: La lista,numero y operador}
PROCEDURE Baja(VAR L:tLista;num:tNumeroTelefono;oper:tOperadorTelefono);
BEGIN
	IF num='' THEN 
		BajaCompania(L,oper)
	ELSE BajaUsuario(L,num);
	MostrarLista(L)
END;

{Tarea:Modifica el operador de un numero especifico
Entrada: La lista,el numero de telefono y el operador al que es cambiado dicho numero
Salida:La lista con el dato modificado o un error si no se puede
}
PROCEDURE Modificacion(VAR L:tLista;num:tNumeroTelefono;operad:tOperadorTelefono);
VAR 
	p:tPos;
	oper:tOperadorTelefono;
BEGIN
	IF (esListaVacia(L)) THEN WRITELN('La lista está vacía')
	ELSE BEGIN
		p:=Buscar(L,num);
		IF p=NULO THEN BEGIN
			WRITELN;
			WRITELN('    *******************************************************************');
			WRITELN('          Error en Modificación: No existe el número ',numero);
			WRITELN('    *******************************************************************')
		END
		ELSE BEGIN
			WRITELN('Modificacion de Abonado: numero ',num,' Nuevo operador ',operad);
			ObtenerDato(L,p,num,oper);
			oper:=operad;
			ActualizaDato(L,p,oper);
		END
	END;
	MostrarLista(L)
END;

{Tarea:Mustra la operacion a realizar
Entrada: La operacion, el numero de telefono y el operador}
PROCEDURE Operaciones(op:STRING;num:tNumeroTelefono;oper:tOperadorTelefono);
BEGIN
   WRITELN;WRITELN;WRITELN;
   WRITELN('    *******************************************************************');
   WRITELN('          Nueva operacion: ',op:2,' Numero: ',num:2,' Operador: ', oper:2);
   WRITELN('    *******************************************************************');
   WRITELN
END;

{Tarea:Consulta la operacion a realizar y llama al correspondiente procedimiento
Entrada:La lista, la operacion, el nuumero de telefono y el operador}
PROCEDURE ConsultaOperacion(VAR L:tLista;operacion:STRING;num:tNumeroTelefono;oper:tOperadorTelefono);
BEGIN
   IF operacion='A'THEN
   	Alta(L,num,oper)
	ELSE IF operacion='B'THEN
      Baja(L,num,oper)
	ELSE IF operacion='M'THEN
      Modificacion(L,num,oper);
END;

{Tarea:Lee la operacion y los datos
Entrada: La lista}
PROCEDURE LeerOperacion(VAR L:tLista);
BEGIN
   {proceso del fichero operaciones.txt }

   {$i-} { Desactiva la comprobacion de errores de entrada/salida}
   Assign(ficheroOperaciones, 'operaciones.txt');
   Reset(ficheroOperaciones);
   {$i+} { Activa la comprobacion de errores de entrada/salida}
   IF (IoResult <> 0) THEN BEGIN
      WRITELN('*** lectura.pas: error al acceder al fichero operaciones.txt');
      halt(1)
   END;

   WHILE NOT EOF(ficheroOperaciones) DO
   BEGIN
      { Lee una linea del fichero y la almacena en tres variables}
      ReadLn(ficheroOperaciones, linea);
      operacion := linea[1];
      numero    := trim(copy(linea,3,12));  { trim elimina los espacios al comienzo y final de un string }
                                            { copy(s, i, j) copia j caracteres del string s }                                                         
				                      	    { a partir de la posicion i }
      operador  := trim(copy(linea,16,20)); 
      { Ahora podria realizarse alguna operacion con los elementos leidos }
      { en este caso mostrarlos por pantalla	                          }
      Operaciones(operacion,numero,operador);
		ConsultaOperacion(L,operacion,numero,operador);
   END;
   Close(ficheroOperaciones);
END;



BEGIN
	ListaVacia(L);
	LeerOperacion(L);
END.





